home *** CD-ROM | disk | FTP | other *** search
/ Ultimedia 2 / Ultimedia 2.iso / tools / soundtools / delitracker_ii / files / developer.lha / Developer / Examples / FC1.3.s next >
Text File  |  1994-04-15  |  21KB  |  922 lines

  1.  
  2.     incdir    "Includes:"
  3.     include    "misc/DeliPlayer.i"
  4.  
  5. ;
  6. ;
  7.     SECTION Player,Code
  8. ;
  9. ;
  10.  
  11.     PLAYERHEADER PlayerTagArray
  12.  
  13.     dc.b '$VER: Future Composer 1.0-1.3 player module V2.2 (15 Mar 94)',0
  14.     even
  15.  
  16. PlayerTagArray
  17.     dc.l    DTP_RequestDTVersion,16
  18.     dc.l    DTP_PlayerVersion,02<<16+20
  19.     dc.l    DTP_PlayerName,PName
  20.     dc.l    DTP_Creator,CName
  21.     dc.l    DTP_Check2,Chk
  22.     dc.l    DTP_CheckLen,ChkLen
  23.     dc.l    DTP_Flags,PLYF_SONGEND
  24.     dc.l    DTP_Interrupt,Int
  25.     dc.l    DTP_InitPlayer,InitPlay
  26.     dc.l    DTP_EndPlayer,EndPlay
  27.     dc.l    DTP_InitSound,InitSnd
  28.     dc.l    DTP_EndSound,RemSnd
  29.     dc.l    DTP_Volume,SetVol
  30.     dc.l    DTP_Balance,SetVol
  31.     dc.l    TAG_DONE
  32.  
  33. *-----------------------------------------------------------------------*
  34. ;
  35. ; Player/Creatorname und lokale Daten
  36.  
  37. PName    dc.b 'FutureComposer_1.3',0
  38. CName    dc.b 'SuperSero of the Superions,',10
  39.     dc.b 'adapted by Delirium',0
  40.     even
  41. MODULE        dc.l 0
  42. fc_songend    dc.l 0
  43.  
  44. fc_SndLVol    dc.w 0
  45. fc_SndRVol    dc.w 0
  46.  
  47. *-----------------------------------------------------------------------*
  48. ;
  49. ;Interrupt für Replay
  50.  
  51. Int
  52.     movem.l    d2-d7/a2-a6,-(sp)
  53.     jsr    PLAY                ; DudelDiDum
  54.     movem.l    (sp)+,d2-d7/a2-a6
  55.     rts
  56.  
  57. *-----------------------------------------------------------------------*
  58. ;
  59. ; Testet auf Modul
  60.  
  61. Chk                        ; FC 1.3 ?
  62.     move.l    dtg_ChkData(a5),a0
  63.     move.l    (a0),d0
  64.     subi.l    #"SMOD",d0
  65.     rts
  66.  
  67. ChkLen = *-Chk
  68.  
  69. *-----------------------------------------------------------------------*
  70. ;
  71. ; Init Player
  72.  
  73. InitPlay
  74.     moveq    #0,d0
  75.     move.l    dtg_GetListData(a5),a0        ; Function
  76.     jsr    (a0)
  77.     move.l    a0,MODULE
  78.  
  79.     move.l    dtg_SongEnd(a5),fc_songend    ; store Songend FunctionPtr
  80.  
  81.     move.l    dtg_AudioAlloc(a5),a0        ; Function
  82.     jsr    (a0)                ; returncode is already set !
  83.     rts
  84.  
  85. *-----------------------------------------------------------------------*
  86. ;
  87. ; End Player
  88.  
  89. EndPlay
  90.     move.l    dtg_AudioFree(a5),a0        ; Function
  91.     jsr    (a0)
  92.     rts
  93.  
  94. *-----------------------------------------------------------------------*
  95. ;
  96. ; Init Sound
  97.  
  98. InitSnd
  99.     jsr    INIT_MUSIC            ; Init Sound
  100.     rts
  101.  
  102. *-----------------------------------------------------------------------*
  103. ;
  104. ; Remove Sound
  105.  
  106. RemSnd
  107.     jsr     END_MUSIC            ; End Sound
  108.     rts
  109.  
  110. *-----------------------------------------------------------------------*
  111. ;
  112. ; Copy Volume and Balance Data to internal buffer
  113.  
  114. SetVol
  115.     move.w    dtg_SndLBal(a5),d0
  116.     mulu    dtg_SndVol(a5),d0
  117.     lsr.w    #6,d0
  118.     move.w    d0,fc_SndLVol            ; Left Volume
  119.  
  120.     move.w    dtg_SndRBal(a5),d0
  121.     mulu    dtg_SndVol(a5),d0
  122.     lsr.w    #6,d0
  123.     move.w    d0,fc_SndRVol            ; Right Volume
  124.     rts
  125.  
  126. *-----------------------------------------------------------------------*
  127. ;
  128. ; FUTURE COMPOSER-Replay 1.0-1.3
  129.  
  130. ;
  131. ;
  132.     SECTION    Replay,Code_C
  133. ;
  134. ;
  135.  
  136. ***************************************************************
  137. **  Amiga FUTURE COMPOSER V1.0 / 1.2 / 1.3   Replay routine  **
  138. ***************************************************************
  139.  
  140.  
  141. END_MUSIC:
  142.     clr.w onoff
  143.     clr.l $dff0a6
  144.     clr.l $dff0b6
  145.     clr.l $dff0c6
  146.     clr.l $dff0d6
  147.     move.w #$000f,$dff096
  148. ;    bclr #1,$bfe001
  149.     rts
  150.  
  151. INIT_MUSIC:
  152.     move.w #1,onoff
  153. ;    bset #1,$bfe001
  154.     move.l MODULE,a0
  155.     lea 100(a0),a1
  156.     move.l a1,SEQpoint
  157.     move.l a0,a1
  158.     add.l 8(a0),a1
  159.     move.l a1,PATpoint
  160.     move.l a0,a1
  161.     add.l 16(a0),a1
  162.     move.l a1,FRQpoint
  163.     move.l a0,a1
  164.     add.l 24(a0),a1
  165.     move.l a1,VOLpoint
  166.     move.l 4(a0),d0
  167.     divu #13,d0
  168.  
  169.     lea 40(a0),a1
  170.     lea SOUNDINFO+4(pc),a2
  171.     moveq #10-1,d1
  172. initloop:
  173.     move.w (a1)+,(a2)+
  174.     move.l (a1)+,(a2)+
  175.     addq.w #4,a2
  176.     dbf d1,initloop
  177.     moveq #0,d2
  178.     move.l a0,d1
  179.     add.l 32(a0),d1
  180.     sub.l #WAVEFORMS,d1
  181.     lea SOUNDINFO(pc),a0
  182.     move.l d1,(a0)+
  183.     moveq #9-1,d3
  184. initloop1:
  185.     move.w (a0),d2
  186.     add.l d2,d1
  187.     add.l d2,d1
  188.     addq.w #6,a0
  189.     move.l d1,(a0)+
  190.     dbf d3,initloop1
  191.  
  192.     move.l SEQpoint(pc),a0
  193.     moveq #0,d2
  194.     move.b 12(a0),d2        ;Get replay speed
  195.     bne.s speedok
  196.     move.b #3,d2            ;Set default speed
  197. speedok:
  198.     move.w d2,respcnt        ;Init repspeed counter
  199.     move.w d2,repspd
  200. INIT2:
  201.     clr.w audtemp
  202.     clr.w spdtemp
  203.     move.w #$000f,$dff096        ;Disable audio DMA
  204.     move.w #$0780,$dff09a        ;Disable audio IRQ
  205.     moveq #0,d7
  206.     mulu #13,d0
  207.     moveq #4-1,d6            ;Number of soundchannels-1
  208.     lea V1data(pc),a0        ;Point to 1st voice data area
  209.     lea SILENT(pc),a1
  210.     lea o4a0c8(pc),a2
  211. initloop2:
  212.     move.l a1,10(a0)
  213.     move.l a1,18(a0)
  214.     clr.l 14(a0)
  215.     clr.b 45(a0)
  216.     clr.b 47(a0)
  217.     clr.w 8(a0)
  218.     clr.l 48(a0)
  219.     move.b #$01,23(a0)
  220.     move.b #$01,24(a0)
  221.     clr.b 25(a0)
  222.     clr.l 26(a0)
  223.     clr.w 30(a0)
  224.     moveq #$00,d3
  225.     move.w (a2)+,d1
  226.     move.w (a2)+,d3
  227.     divu #$0003,d3
  228.     move.b d3,32(a0)
  229.     mulu #$0003,d3
  230.     andi.l #$00ff,d3
  231.     andi.l #$00ff,d1
  232.     addi.l #$dff0a0,d1
  233.     move.l d1,a6
  234.     move.l #$0000,(a6)
  235.     move.w #$0100,4(a6)
  236.     move.w #$0000,6(a6)
  237.     move.w #$0000,8(a6)
  238.     move.l d1,60(a0)
  239.     clr.w 64(a0)
  240.     move.l SEQpoint(pc),(a0)
  241.     move.l SEQpoint(pc),52(a0)
  242.     add.l d0,52(a0)
  243.     add.l d3,52(a0)
  244.     add.l d7,(a0)
  245.     add.l d3,(a0)
  246.     move.w #$000d,6(a0)
  247.     move.l (a0),a3
  248.     move.b (a3),d1
  249.     andi.l #$00ff,d1
  250.     lsl.w #6,d1
  251.     move.l PATpoint(pc),a4
  252.     adda.w d1,a4
  253.     move.l a4,34(a0)
  254.     clr.l 38(a0)
  255.     move.b #$01,33(a0)
  256.     move.b #$02,42(a0)
  257.     move.b 1(a3),44(a0)
  258.     move.b 2(a3),22(a0)
  259.     clr.b 43(a0)
  260.     clr.b 45(a0)
  261.     clr.w 56(a0)
  262.     adda.w #$004a,a0    ;Point to next voice's data area
  263.     dbf d6,initloop2
  264.     rts
  265.  
  266.  
  267. PLAY:
  268.     lea pervol(pc),a6
  269.     tst.w onoff
  270.     bne.s music_on
  271.     rts
  272. music_on:
  273.     subq.w #1,respcnt        ;Decrease replayspeed counter
  274.     bne.s nonewnote
  275.     move.w repspd(pc),respcnt    ;Restore replayspeed counter
  276.     lea V1data(pc),a0        ;Point to voice1 data area
  277.     bsr new_note
  278.     lea V2data(pc),a0        ;Point to voice2 data area
  279.     bsr new_note
  280.     lea V3data(pc),a0        ;Point to voice3 data area
  281.     bsr new_note
  282.     lea V4data(pc),a0        ;Point to voice4 data area
  283.     bsr new_note
  284. nonewnote:
  285.     clr.w audtemp
  286.     lea V1data(pc),a0
  287.     bsr effects
  288.     move.w d0,(a6)+
  289.     move.w d1,(a6)+
  290.     lea V2data(pc),a0
  291.     bsr effects
  292.     move.w d0,(a6)+
  293.     move.w d1,(a6)+
  294.     lea V3data(pc),a0
  295.     bsr effects
  296.     move.w d0,(a6)+
  297.     move.w d1,(a6)+
  298.     lea V4data(pc),a0
  299.     bsr effects
  300.     move.w d0,(a6)+
  301.     move.w d1,(a6)+
  302.     lea pervol(pc),a6
  303.     move.w audtemp(pc),d0
  304.     ori.w #$8000,d0            ;Set/clr bit = 1
  305.     move.w d0,-(a7)
  306.     moveq #0,d1
  307.     move.l start1(pc),d2        ;Get samplepointers
  308.     move.w offset1(pc),d1        ;Get offset
  309.     add.l d1,d2            ;Add offset
  310.     move.l start2(pc),d3
  311.     move.w offset2(pc),d1
  312.     add.l d1,d3
  313.     move.l start3(pc),d4
  314.     move.w offset3(pc),d1
  315.     add.l d1,d4
  316.     move.l start4(pc),d5
  317.     move.w offset4(pc),d1
  318.     add.l d1,d5
  319.     move.w ssize1(pc),d0        ;Get sound lengths
  320.     move.w ssize2(pc),d1
  321.     move.w ssize3(pc),d6
  322.     move.w ssize4(pc),d7
  323.     move.w (a7)+,$dff096        ;Enable audio DMA
  324. chan1:
  325.     lea V1data(pc),a0
  326.     tst.w 72(a0)
  327.     beq.s chan2
  328.     subq.w #1,72(a0)
  329.     cmpi.w #1,72(a0)
  330.     bne.s chan2
  331.     clr.w 72(a0)
  332.     move.l d2,$dff0a0        ;Set soundstart
  333.     move.w d0,$dff0a4        ;Set soundlength
  334. chan2:
  335.     lea V2data(pc),a0
  336.     tst.w 72(a0)
  337.     beq.s chan3
  338.     subq.w #1,72(a0)
  339.     cmpi.w #1,72(a0)
  340.     bne.s chan3
  341.     clr.w 72(a0)
  342.     move.l d3,$dff0b0
  343.     move.w d1,$dff0b4
  344. chan3:
  345.     lea V3data(pc),a0
  346.     tst.w 72(a0)
  347.     beq.s chan4
  348.     subq.w #1,72(a0)
  349.     cmpi.w #1,72(a0)
  350.     bne.s chan4
  351.     clr.w 72(a0)
  352.     move.l d4,$dff0c0
  353.     move.w d6,$dff0c4
  354. chan4:
  355.     lea V4data(pc),a0
  356.     tst.w 72(a0)
  357.     beq.s setpervol
  358.     subq.w #1,72(a0)
  359.     cmpi.w #1,72(a0)
  360.     bne.s setpervol
  361.     clr.w 72(a0)
  362.     move.l d5,$dff0d0
  363.     move.w d7,$dff0d4
  364. setpervol:
  365.     lea $dff0a6,a5
  366.     move.w (a6)+,(a5)    ;Set period
  367.     move.w (a6)+,d0        ; added
  368.     mulu fc_SndLVol,d0    ; by
  369.     lsr.w #6,d0        ; Delirium
  370.     move.w d0,2(a5)        ;Set volume
  371.  
  372.     move.w (a6)+,16(a5)    ;Set period
  373.     move.w (a6)+,d0        ; added
  374.     mulu fc_SndRVol,d0    ; by
  375.     lsr.w #6,d0        ; Delirium
  376.     move.w d0,18(a5)    ;Set volume
  377.  
  378.     move.w (a6)+,32(a5)    ;Set period
  379.     move.w (a6)+,d0        ; added
  380.     mulu fc_SndRVol,d0    ; by
  381.     lsr.w #6,d0        ; Delirium
  382.     move.w d0,34(a5)    ;Set volume
  383.  
  384.     move.w (a6)+,48(a5)    ;Set period
  385.     move.w (a6)+,d0        ; added
  386.     mulu fc_SndLVol,d0    ; by
  387.     lsr.w #6,d0        ; Delirium
  388.     move.w d0,50(a5)    ;Set volume
  389.     rts
  390.  
  391. new_note:
  392.     moveq #0,d5
  393.     move.l 34(a0),a1
  394.     adda.w 40(a0),a1
  395.     cmp.w #64,40(a0)
  396.     bne samepat
  397.     move.l (a0),a2
  398.     adda.w 6(a0),a2        ;Point to next sequence row
  399.     cmpa.l 52(a0),a2    ;Is it the end?
  400.     bne.s notend
  401.     move.l    fc_songend,a2
  402.     jsr    (a2)        ; signal songend to DeliTracker
  403.     move.w d5,6(a0)        ;yes!
  404.     move.l (a0),a2        ;Point to first sequence
  405. notend:
  406.     moveq #1,d1
  407.     addq.b #1,spdtemp
  408.     cmpi.b #5,spdtemp
  409.     bne.s nonewspd
  410.     move.b d1,spdtemp
  411.     move.b 12(a2),d1    ;Get new replay speed
  412.     beq.s nonewspd
  413.     move.w d1,respcnt    ;store in counter
  414.     move.w d1,repspd
  415. nonewspd:
  416.     move.b (a2),d1        ;Pattern to play
  417.     move.b 1(a2),44(a0)    ;Transpose value
  418.     move.b 2(a2),22(a0)    ;Soundtranspose value
  419.  
  420.     move.w d5,40(a0)
  421.     lsl.w #6,d1
  422.     add.l PATpoint(pc),d1    ;Get pattern pointer
  423.     move.l d1,34(a0)
  424.     addi.w #$000d,6(a0)
  425.     move.l d1,a1
  426. samepat:
  427.     move.b 1(a1),d1        ;Get info byte
  428.     move.b (a1)+,d0        ;Get note
  429.     bne.s ww1
  430.     andi.w #%11000000,d1
  431.     beq.s noport
  432.     bra.s ww11
  433. ww1:
  434.     move.w d5,56(a0)
  435. ww11:
  436.     move.b d5,47(a0)
  437.     move.b (a1),31(a0)
  438.  
  439.         ;31(a0) = PORTAMENTO/INSTR. info
  440.             ;Bit 7 = portamento on
  441.             ;Bit 6 = portamento off
  442.             ;Bit 5-0 = instrument number
  443.         ;47(a0) = portamento value
  444.             ;Bit 7-5 = always zero
  445.             ;Bit 4 = up/down
  446.             ;Bit 3-0 = value
  447. t_porton:
  448.     btst #7,d1
  449.     beq.s noport
  450.     move.b 2(a1),47(a0)    
  451. noport:
  452.     andi.w #$007f,d0
  453.     beq nextnote
  454.     move.b d0,8(a0)
  455.     move.b (a1),9(a0)
  456.     move.b 32(a0),d2
  457.     moveq #0,d3
  458.     bset d2,d3
  459.     or.w d3,audtemp
  460.     move.w d3,$dff096
  461.     move.b (a1),d1
  462.     andi.w #$003f,d1    ;Max 64 instruments
  463.     add.b 22(a0),d1
  464.     move.l VOLpoint(pc),a2
  465.     lsl.w #6,d1
  466.     adda.w d1,a2
  467.     move.w d5,16(a0)
  468.     move.b (a2),23(a0)
  469.     move.b (a2)+,24(a0)
  470.     move.b (a2)+,d1
  471.     andi.w #$00ff,d1
  472.     move.b (a2)+,27(a0)
  473.     move.b #$40,46(a0)
  474.     move.b (a2)+,d0
  475.     move.b d0,28(a0)
  476.     move.b d0,29(a0)
  477.     move.b (a2)+,30(a0)
  478.     move.l a2,10(a0)
  479.     move.l FRQpoint(pc),a2
  480.     lsl.w #6,d1
  481.     adda.w d1,a2
  482.     move.l a2,18(a0)
  483.     move.w d5,50(a0)
  484.     move.b d5,26(a0)
  485.     move.b d5,25(a0)
  486. nextnote:
  487.     addq.w #2,40(a0)
  488.     rts
  489.  
  490. effects:
  491.     moveq #0,d7
  492. testsustain:
  493.     tst.b 26(a0)        ;Is sustain counter = 0
  494.     beq.s sustzero
  495.     subq.b #1,26(a0)    ;if no, decrease counter
  496.     bra VOLUfx
  497. sustzero:        ;Next part of effect sequence
  498.     move.l 18(a0),a1    ;can be executed now.
  499.     adda.w 50(a0),a1
  500. testeffects:
  501.     cmpi.b #$e1,(a1)    ;E1 = end of FREQseq sequence
  502.     beq VOLUfx
  503.     cmpi.b #$e0,(a1)    ;E0 = loop to other part of sequence
  504.     bne.s testnewsound
  505.     move.b 1(a1),d0        ;loop to start of sequence + 1(a1)
  506.     andi.w #$003f,d0
  507.     move.w d0,50(a0)
  508.     move.l 18(a0),a1
  509.     adda.w d0,a1
  510. testnewsound:
  511.     cmpi.b #$e2,(a1)    ;E2 = set waveform
  512.     bne.s o49c64
  513.     moveq #0,d0
  514.     moveq #0,d1
  515.     move.b 32(a0),d1
  516.     bset d1,d0
  517.     or.w d0,audtemp
  518.     move.w d0,$dff096
  519.     move.b 1(a1),d0
  520.     andi.w #$00ff,d0
  521.     lea SOUNDINFO(pc),a4
  522.     add.w d0,d0
  523.     move.w d0,d1
  524.     add.w d1,d1
  525.     add.w d1,d1
  526.     add.w d1,d0
  527.     adda.w d0,a4
  528.     move.l 60(a0),a3
  529.     move.l (a4),d1
  530.     add.l #WAVEFORMS,d1
  531.     move.l d1,(a3)
  532.     move.l d1,68(a0)
  533.     move.w 4(a4),4(a3)
  534.     move.l 6(a4),64(a0)
  535.     swap d1
  536.     move.w #$0003,72(a0)
  537.     tst.w d1
  538.     bne.s o49c52
  539.     move.w #$0002,72(a0)
  540. o49c52:
  541.     clr.w 16(a0)
  542.     move.b #$01,23(a0)
  543.     addq.w #2,50(a0)
  544.     bra o49d02
  545. o49c64:
  546.     cmpi.b #$e4,(a1)
  547.     bne.s testpatjmp
  548.     move.b 1(a1),d0
  549.     andi.w #$00ff,d0
  550.     lea SOUNDINFO(pc),a4
  551.     add.w d0,d0
  552.     move.w d0,d1
  553.     add.w d1,d1
  554.     add.w d1,d1
  555.     add.w d1,d0
  556.     adda.w d0,a4
  557.     move.l 60(a0),a3
  558.     move.l (a4),d1
  559.     add.l #WAVEFORMS,d1
  560.     move.l d1,(a3)
  561.     move.l d1,68(a0)
  562.     move.w 4(a4),4(a3)
  563.     move.l 6(a4),64(a0)
  564.  
  565.     swap d1
  566.     move.w #$0003,72(a0)
  567.     tst.w d1
  568.     bne.s o49cae
  569.     move.w #$0002,72(a0)
  570. o49cae:
  571.     addq.w #2,50(a0)
  572.     bra.s o49d02
  573. testpatjmp:
  574.     cmpi.b #$e7,(a1)
  575.     bne.s testnewsustain
  576.     move.b 1(a1),d0
  577.     andi.w #$00ff,d0
  578.     lsl.w #6,d0
  579.     move.l FRQpoint(pc),a1
  580.     adda.w d0,a1
  581.     move.l a1,18(a0)
  582.     move.w d7,50(a0)
  583.     bra testeffects
  584. testnewsustain:
  585.     cmpi.b #$e8,(a1)    ;E8 = set sustain time
  586.     bne.s o49cea
  587.     move.b 1(a1),26(a0)
  588.     addq.w #2,50(a0)
  589.     bra testsustain
  590. o49cea:
  591.     cmpi.b #$e3,(a1)
  592.     bne.s o49d02
  593.     addq.w #3,50(a0)
  594.     move.b 1(a1),27(a0)
  595.     move.b 2(a1),28(a0)
  596. o49d02:
  597.     move.l 18(a0),a1
  598.     adda.w 50(a0),a1
  599.     move.b (a1),43(a0)
  600.     addq.w #1,50(a0)
  601. VOLUfx:
  602.     tst.b 25(a0)
  603.     beq.s o49d1e
  604.     subq.b #1,25(a0)
  605.     bra.s o49d70
  606. o49d1e:
  607.     subq.b #1,23(a0)
  608.     bne.s o49d70
  609.     move.b 24(a0),23(a0)
  610. o49d2a:
  611.     move.l 10(a0),a1
  612.     adda.w 16(a0),a1
  613.     move.b (a1),d0
  614.     cmpi.b #$e8,d0
  615.     bne.s o49d4a
  616.     addq.w #2,16(a0)
  617.     move.b 1(a1),25(a0)
  618.     bra.s VOLUfx
  619. o49d4a:
  620.     cmpi.b #$e1,d0
  621.     beq.s o49d70
  622.     cmpi.b #$e0,d0
  623.     bne.s o49d68
  624.     move.b 1(a1),d0
  625.     andi.l #$003f,d0
  626.     subq.b #5,d0
  627.     move.w d0,16(a0)
  628.     bra.s o49d2a
  629. o49d68:
  630.     move.b (a1),45(a0)
  631.     addq.w #1,16(a0)
  632. o49d70:
  633.     move.b 43(a0),d0
  634.     bmi.s o49d7e
  635.     add.b 8(a0),d0
  636.     add.b 44(a0),d0
  637. o49d7e:
  638.     andi.w #$007f,d0
  639.     lea PERIODS(pc),a1
  640.     add.w d0,d0
  641.     move.w d0,d1
  642.     adda.w d0,a1
  643.     move.w (a1),d0
  644.     move.b 46(a0),d7
  645.     tst.b 30(a0)
  646.     beq.s o49d9e
  647.     subq.b #1,30(a0)
  648.  
  649.     bra.s o49df4
  650. o49d9e:
  651.     move.b d1,d5
  652.     move.b 28(a0),d4
  653.     add.b d4,d4
  654.     move.b 29(a0),d1
  655.     tst.b d7
  656.     bpl.s o49db4
  657.     btst #0,d7
  658.     bne.s o49dda
  659. o49db4:
  660.     btst #5,d7
  661.     bne.s o49dc8
  662.     sub.b 27(a0),d1
  663.     bcc.s o49dd6
  664.     bset #5,d7
  665.     moveq #0,d1
  666.     bra.s o49dd6
  667. o49dc8:
  668.     add.b 27(a0),d1
  669.     cmp.b d4,d1
  670.     bcs.s o49dd6
  671.     bclr #5,d7
  672.     move.b d4,d1
  673. o49dd6:
  674.     move.b d1,29(a0)
  675. o49dda:
  676.     lsr.b #1,d4
  677.     sub.b d4,d1
  678.     bcc.s o49de4
  679.     subi.w #$0100,d1
  680. o49de4:
  681.     addi.b #$a0,d5
  682.     bcs.s o49df2
  683. o49dea:
  684.     add.w d1,d1
  685.     addi.b #$18,d5
  686.     bcc.s o49dea
  687. o49df2:
  688.     add.w d1,d0
  689. o49df4:
  690.     eori.b #$01,d7
  691.     move.b d7,46(a0)
  692.  
  693.     ; DO THE PORTAMENTO THING
  694.     moveq #0,d1
  695.     move.b 47(a0),d1    ;get portavalue
  696.     beq.s a56d0        ;0=no portamento
  697.     cmpi.b #$1f,d1
  698.     bls.s portaup
  699. portadown: 
  700.     andi.w #$1f,d1
  701.     neg.w d1
  702. portaup:
  703.     sub.w d1,56(a0)
  704. a56d0:
  705.     add.w 56(a0),d0
  706. o49e3e:
  707.     cmpi.w #$0070,d0
  708.     bhi.s nn1
  709.     move.w #$0071,d0
  710. nn1:
  711.     cmpi.w #$06b0,d0
  712.     bls.s nn2
  713.     move.w #$06b0,d0
  714. nn2:
  715.     moveq #0,d1
  716.     move.b 45(a0),d1
  717.     rts
  718.  
  719.  
  720.  
  721. pervol: dcb.b 16,0    ;Periods & Volumes temp. store
  722. respcnt: dc.w 0        ;Replay speed counter 
  723. repspd:  dc.w 0        ;Replay speed counter temp
  724. onoff:   dc.w 0        ;Music on/off flag.
  725. firseq:     dc.w 0        ;First sequence
  726. lasseq:     dc.w 0        ;Last sequence
  727. audtemp: dc.w 0
  728. spdtemp: dc.w 0
  729.  
  730. V1data:  dcb.b 64,0    ;Voice 1 data area
  731. offset1: dcb.b 02,0    ;Is added to start of sound
  732. ssize1:  dcb.b 02,0    ;Length of sound
  733. start1:  dcb.b 06,0    ;Start of sound
  734.  
  735. V2data:  dcb.b 64,0    ;Voice 2 data area
  736. offset2: dcb.b 02,0
  737. ssize2:  dcb.b 02,0
  738. start2:  dcb.b 06,0
  739.  
  740. V3data:  dcb.b 64,0    ;Voice 3 data area
  741. offset3: dcb.b 02,0
  742. ssize3:  dcb.b 02,0
  743. start3:  dcb.b 06,0
  744.  
  745. V4data:  dcb.b 64,0    ;Voice 4 data area
  746. offset4: dcb.b 02,0
  747. ssize4:  dcb.b 02,0
  748. start4:  dcb.b 06,0
  749.  
  750. o4a0c8: dc.l $00000000,$00100003,$00200006,$00300009
  751. SEQpoint: dc.l 0
  752. PATpoint: dc.l 0
  753. FRQpoint: dc.l 0
  754. VOLpoint: dc.l 0
  755.  
  756.  
  757.     even
  758. SILENT: dc.w $0100,$0000,$0000,$00e1
  759.  
  760. PERIODS:dc.w $06b0,$0650,$05f4,$05a0,$054c,$0500,$04b8,$0474
  761.     dc.w $0434,$03f8,$03c0,$038a,$0358,$0328,$02fa,$02d0
  762.     dc.w $02a6,$0280,$025c,$023a,$021a,$01fc,$01e0,$01c5
  763.     dc.w $01ac,$0194,$017d,$0168,$0153,$0140,$012e,$011d
  764.     dc.w $010d,$00fe,$00f0,$00e2,$00d6,$00ca,$00be,$00b4
  765.     dc.w $00aa,$00a0,$0097,$008f,$0087,$007f,$0078,$0071
  766.     dc.w $0071,$0071,$0071,$0071,$0071,$0071,$0071,$0071
  767.     dc.w $0071,$0071,$0071,$0071,$0d60,$0ca0,$0be8,$0b40
  768.     dc.w $0a98,$0a00,$0970,$08e8,$0868,$07f0,$0780,$0714
  769.     dc.w $1ac0,$1940,$17d0,$1680,$1530,$1400,$12e0,$11d0
  770.     dc.w $10d0,$0fe0,$0f00,$0e28
  771.  
  772. SOUNDINFO:
  773. ;Offset.l , Sound-length.w , Start-offset.w , Repeat-length.w 
  774.  
  775. ;Reserved for samples
  776.     dc.w $0000,$0000,$0000,$0000,$0001 
  777.     dc.w $0000,$0000,$0000,$0000,$0001 
  778.     dc.w $0000,$0000,$0000,$0000,$0001 
  779.     dc.w $0000,$0000,$0000,$0000,$0001 
  780.     dc.w $0000,$0000,$0000,$0000,$0001 
  781.     dc.w $0000,$0000,$0000,$0000,$0001 
  782.     dc.w $0000,$0000,$0000,$0000,$0001 
  783.     dc.w $0000,$0000,$0000,$0000,$0001 
  784.     dc.w $0000,$0000,$0000,$0000,$0001 
  785.     dc.w $0000,$0000,$0000,$0000,$0001 
  786. ;Reserved for synth sounds
  787.     dc.w $0000,$0000,$0010,$0000,$0010 
  788.     dc.w $0000,$0020,$0010,$0000,$0010 
  789.     dc.w $0000,$0040,$0010,$0000,$0010 
  790.     dc.w $0000,$0060,$0010,$0000,$0010 
  791.     dc.w $0000,$0080,$0010,$0000,$0010 
  792.     dc.w $0000,$00a0,$0010,$0000,$0010 
  793.     dc.w $0000,$00c0,$0010,$0000,$0010 
  794.     dc.w $0000,$00e0,$0010,$0000,$0010 
  795.     dc.w $0000,$0100,$0010,$0000,$0010 
  796.     dc.w $0000,$0120,$0010,$0000,$0010 
  797.     dc.w $0000,$0140,$0010,$0000,$0010 
  798.     dc.w $0000,$0160,$0010,$0000,$0010 
  799.     dc.w $0000,$0180,$0010,$0000,$0010 
  800.     dc.w $0000,$01a0,$0010,$0000,$0010 
  801.     dc.w $0000,$01c0,$0010,$0000,$0010 
  802.     dc.w $0000,$01e0,$0010,$0000,$0010 
  803.     dc.w $0000,$0200,$0010,$0000,$0010 
  804.     dc.w $0000,$0220,$0010,$0000,$0010 
  805.     dc.w $0000,$0240,$0010,$0000,$0010 
  806.     dc.w $0000,$0260,$0010,$0000,$0010 
  807.     dc.w $0000,$0280,$0010,$0000,$0010 
  808.     dc.w $0000,$02a0,$0010,$0000,$0010 
  809.     dc.w $0000,$02c0,$0010,$0000,$0010 
  810.     dc.w $0000,$02e0,$0010,$0000,$0010 
  811.     dc.w $0000,$0300,$0010,$0000,$0010 
  812.     dc.w $0000,$0320,$0010,$0000,$0010 
  813.     dc.w $0000,$0340,$0010,$0000,$0010 
  814.     dc.w $0000,$0360,$0010,$0000,$0010 
  815.     dc.w $0000,$0380,$0010,$0000,$0010 
  816.     dc.w $0000,$03a0,$0010,$0000,$0010 
  817.     dc.w $0000,$03c0,$0010,$0000,$0010 
  818.     dc.w $0000,$03e0,$0010,$0000,$0010 
  819.     dc.w $0000,$0400,$0008,$0000,$0008 
  820.     dc.w $0000,$0410,$0008,$0000,$0008 
  821.     dc.w $0000,$0420,$0008,$0000,$0008 
  822.     dc.w $0000,$0430,$0008,$0000,$0008 
  823.     dc.w $0000,$0440,$0008,$0000,$0008
  824.     dc.w $0000,$0450,$0008,$0000,$0008
  825.     dc.w $0000,$0460,$0008,$0000,$0008
  826.     dc.w $0000,$0470,$0008,$0000,$0008
  827.     dc.w $0000,$0480,$0010,$0000,$0010
  828.     dc.w $0000,$04a0,$0008,$0000,$0008
  829.     dc.w $0000,$04b0,$0010,$0000,$0010
  830.     dc.w $0000,$04d0,$0010,$0000,$0010
  831.     dc.w $0000,$04f0,$0008,$0000,$0008
  832.     dc.w $0000,$0500,$0008,$0000,$0008
  833.     dc.w $0000,$0510,$0018,$0000,$0018
  834.  
  835.  
  836. WAVEFORMS:
  837.     dc.w $c0c0,$d0d8,$e0e8,$f0f8,$00f8,$f0e8,$e0d8,$d0c8
  838.     dc.w $3f37,$2f27,$1f17,$0f07,$ff07,$0f17,$1f27,$2f37
  839.     dc.w $c0c0,$d0d8,$e0e8,$f0f8,$00f8,$f0e8,$e0d8,$d0c8
  840.     dc.w $c037,$2f27,$1f17,$0f07,$ff07,$0f17,$1f27,$2f37
  841.     dc.w $c0c0,$d0d8,$e0e8,$f0f8,$00f8,$f0e8,$e0d8,$d0c8
  842.     dc.w $c0b8,$2f27,$1f17,$0f07,$ff07,$0f17,$1f27,$2f37
  843.     dc.w $c0c0,$d0d8,$e0e8,$f0f8,$00f8,$f0e8,$e0d8,$d0c8
  844.     dc.w $c0b8,$b027,$1f17,$0f07,$ff07,$0f17,$1f27,$2f37
  845.     dc.w $c0c0,$d0d8,$e0e8,$f0f8,$00f8,$f0e8,$e0d8,$d0c8
  846.     dc.w $c0b8,$b0a8,$1f17,$0f07,$ff07,$0f17,$1f27,$2f37
  847.     dc.w $c0c0,$d0d8,$e0e8,$f0f8,$00f8,$f0e8,$e0d8,$d0c8
  848.     dc.w $c0b8,$b0a8,$a017,$0f07,$ff07,$0f17,$1f27,$2f37
  849.     dc.w $c0c0,$d0d8,$e0e8,$f0f8,$00f8,$f0e8,$e0d8,$d0c8
  850.     dc.w $c0b8,$b0a8,$a098,$0f07,$ff07,$0f17,$1f27,$2f37
  851.     dc.w $c0c0,$d0d8,$e0e8,$f0f8,$00f8,$f0e8,$e0d8,$d0c8
  852.     dc.w $c0b8,$b0a8,$a098,$9007,$ff07,$0f17,$1f27,$2f37
  853.     dc.w $c0c0,$d0d8,$e0e8,$f0f8,$00f8,$f0e8,$e0d8,$d0c8
  854.     dc.w $c0b8,$b0a8,$a098,$9088,$ff07,$0f17,$1f27,$2f37
  855.     dc.w $c0c0,$d0d8,$e0e8,$f0f8,$00f8,$f0e8,$e0d8,$d0c8
  856.     dc.w $c0b8,$b0a8,$a098,$9088,$8007,$0f17,$1f27,$2f37
  857.     dc.w $c0c0,$d0d8,$e0e8,$f0f8,$00f8,$f0e8,$e0d8,$d0c8
  858.     dc.w $c0b8,$b0a8,$a098,$9088,$8088,$0f17,$1f27,$2f37
  859.     dc.w $c0c0,$d0d8,$e0e8,$f0f8,$00f8,$f0e8,$e0d8,$d0c8
  860.     dc.w $c0b8,$b0a8,$a098,$9088,$8088,$9017,$1f27,$2f37
  861.     dc.w $c0c0,$d0d8,$e0e8,$f0f8,$00f8,$f0e8,$e0d8,$d0c8
  862.     dc.w $c0b8,$b0a8,$a098,$9088,$8088,$9098,$1f27,$2f37
  863.     dc.w $c0c0,$d0d8,$e0e8,$f0f8,$00f8,$f0e8,$e0d8,$d0c8
  864.     dc.w $c0b8,$b0a8,$a098,$9088,$8088,$9098,$a027,$2f37
  865.     dc.w $c0c0,$d0d8,$e0e8,$f0f8,$00f8,$f0e8,$e0d8,$d0c8
  866.     dc.w $c0b8,$b0a8,$a098,$9088,$8088,$9098,$a0a8,$2f37
  867.     dc.w $c0c0,$d0d8,$e0e8,$f0f8,$00f8,$f0e8,$e0d8,$d0c8
  868.     dc.w $c0b8,$b0a8,$a098,$9088,$8088,$9098,$a0a8,$b037
  869.     dc.w $8181,$8181,$8181,$8181,$8181,$8181,$8181,$8181
  870.     dc.w $7f7f,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f
  871.     dc.w $8181,$8181,$8181,$8181,$8181,$8181,$8181,$8181
  872.     dc.w $817f,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f
  873.     dc.w $8181,$8181,$8181,$8181,$8181,$8181,$8181,$8181
  874.     dc.w $8181,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f
  875.     dc.w $8181,$8181,$8181,$8181,$8181,$8181,$8181,$8181
  876.     dc.w $8181,$817f,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f
  877.     dc.w $8181,$8181,$8181,$8181,$8181,$8181,$8181,$8181
  878.     dc.w $8181,$8181,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f
  879.     dc.w $8181,$8181,$8181,$8181,$8181,$8181,$8181,$8181
  880.     dc.w $8181,$8181,$817f,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f
  881.     dc.w $8181,$8181,$8181,$8181,$8181,$8181,$8181,$8181
  882.     dc.w $8181,$8181,$8181,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f
  883.     dc.w $8181,$8181,$8181,$8181,$8181,$8181,$8181,$8181
  884.     dc.w $8181,$8181,$8181,$817f,$7f7f,$7f7f,$7f7f,$7f7f
  885.     dc.w $8181,$8181,$8181,$8181,$8181,$8181,$8181,$8181
  886.     dc.w $8181,$8181,$8181,$8181,$7f7f,$7f7f,$7f7f,$7f7f
  887.     dc.w $8181,$8181,$8181,$8181,$8181,$8181,$8181,$8181
  888.     dc.w $8181,$8181,$8181,$8181,$817f,$7f7f,$7f7f,$7f7f
  889.     dc.w $8181,$8181,$8181,$8181,$8181,$8181,$8181,$8181
  890.     dc.w $8181,$8181,$8181,$8181,$8181,$7f7f,$7f7f,$7f7f
  891.     dc.w $8181,$8181,$8181,$8181,$8181,$8181,$8181,$8181
  892.     dc.w $8181,$8181,$8181,$8181,$8181,$817f,$7f7f,$7f7f
  893.     dc.w $8181,$8181,$8181,$8181,$8181,$8181,$8181,$8181
  894.     dc.w $8181,$8181,$8181,$8181,$8181,$8181,$7f7f,$7f7f
  895.     dc.w $8181,$8181,$8181,$8181,$8181,$8181,$8181,$8181
  896.     dc.w $8181,$8181,$8181,$8181,$8181,$8181,$817f,$7f7f
  897.     dc.w $8080,$8080,$8080,$8080,$8080,$8080,$8080,$8080
  898.     dc.w $8080,$8080,$8080,$8080,$8080,$8080,$8080,$7f7f
  899.     dc.w $8080,$8080,$8080,$8080,$8080,$8080,$8080,$8080
  900.     dc.w $8080,$8080,$8080,$8080,$8080,$8080,$8080,$807f
  901.     dc.w $8080,$8080,$8080,$8080,$7f7f,$7f7f,$7f7f,$7f7f
  902.     dc.w $8080,$8080,$8080,$807f,$7f7f,$7f7f,$7f7f,$7f7f
  903.     dc.w $8080,$8080,$8080,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f
  904.     dc.w $8080,$8080,$807f,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f
  905.     dc.w $8080,$8080,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f
  906.     dc.w $8080,$807f,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f
  907.     dc.w $8080,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f
  908.     dc.w $8080,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f
  909.     dc.w $8080,$9098,$a0a8,$b0b8,$c0c8,$d0d8,$e0e8,$f0f8
  910.     dc.w $0008,$1018,$2028,$3038,$4048,$5058,$6068,$707f
  911.     dc.w $8080,$a0b0,$c0d0,$e0f0,$0010,$2030,$4050,$6070
  912.     dc.w $4545,$797d,$7a77,$7066,$6158,$534d,$2c20,$1812
  913.     dc.w $04db,$d3cd,$c6bc,$b5ae,$a8a3,$9d99,$938e,$8b8a
  914.     dc.w $4545,$797d,$7a77,$7066,$5b4b,$4337,$2c20,$1812
  915.     dc.w $04f8,$e8db,$cfc6,$beb0,$a8a4,$9e9a,$9594,$8d83
  916.     dc.w $0000,$4060,$7f60,$4020,$00e0,$c0a0,$80a0,$c0e0
  917.     dc.w $0000,$4060,$7f60,$4020,$00e0,$c0a0,$80a0,$c0e0
  918.     dc.w $8080,$9098,$a0a8,$b0b8,$c0c8,$d0d8,$e0e8,$f0f8
  919.     dc.w $0008,$1018,$2028,$3038,$4048,$5058,$6068,$707f
  920.     dc.w $8080,$a0b0,$c0d0,$e0f0,$0010,$2030,$4050,$6070
  921.  
  922.